package demo09;

/**
 * @author: WangPeng
 * @createTime: 2022/11/02 17:09
 * @description:
 * @version: v1.0
 */

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * Executor  线程池的顶级接口: 在该接口只有一个抽象方法void execute(Runnable command); 该方法用来执行Runnable类型的任务。
 *   ExecutorService: 它是Executor的子接口，它里面包含的方法:
 *       void shutdown(); 关闭线程池，把线程池中提交的任务执行完后再关闭
 *       List<Runnable> shutdownNow(); 立即关闭，把一些等待的任务关闭。
 *       boolean isShutdown(); 判断线程池是否关闭。
 *       boolean isTerminated();判断线程池是否终止。---表示任务是否执行完。
 *       <T> Future<T> submit(Callable<T> task); 提交Callable类型的任务给线程池。
 *       Future<?> submit(Runnable task); 提交Runnable类型的任务给线程池
 *
 * Executors: 它是一个工具类，可以帮你创建相应的线程池对象。
 *      (1)newSingleThreadExecutor  创建单一线程池---池子中有且仅有一个线程对象。：适合只有单线程执行，要求线程按照顺序执行。
 *      (2)newFixedThreadPool       创建固定长度的线程池---池子中线程的数量是固定的---里面预先会创建n个线程对象。:   适合服务器负载比较重。
 *      (3) newCachedThreadPool     创建可变线程池---根据任务个数动态创建线程对象:  适合短期任务比较重。
 *      (4) newScheduledThreadPool  创建延迟线程池:   适合延期执行任务的线程。
 */
public class TestExecutors {
    public static void main(String[] args) {
        //1、创建单一线程池:
        ExecutorService executorService1 = Executors.newSingleThreadExecutor();
        //2、创建固定长度的线程对象:
        ExecutorService executorService2 = Executors.newFixedThreadPool(5);
        //3、创建可变线程池:
        ExecutorService executorService3 = Executors.newCachedThreadPool();
        //4、创建延迟线程池
        ScheduledExecutorService executorService4 = Executors.newScheduledThreadPool(5);
        //往线程池中提交任务。
        for (int i = 0; i < 10; i++) {
            final int a = i;
            executorService4.schedule(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"正在执行==="+a);
                }
            },10, TimeUnit.SECONDS);//等待10秒执行，单位是秒
//            executorService3.submit(new Runnable() {
//                @Override
//                public void run() {
//                    System.out.println(Thread.currentThread().getName()+"正在执行==="+a);
//                }
//            });
        }
    }
}
